package org.ssp.filter;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * filter过滤器的三种应用场景：
 * 1.可以在filter中根据条件决定是否调用chain.doFilter(request,responses)方法即是否让目标资源执行
 * 2，在让目标资源执行之前，可以对request/response做预处理，再让目标资源执行
 * 3，在目标资源执行后，可以捕获目标资源的执行结果，从而实现一些特殊功能，比如压缩响应
 * 
 * 过滤器链：
 * 可以同时创建多个，
 * 执行顺序是在web.xml中的注册顺序
 * 
 * 
 * filter的声明周期：
 * web应用程序启动时,web服务器创建filter的实例对象,并调用器init方法。
 * filter对象只会创建一次，init方法也只会执行一次
 * 
 * 
 * 1）创建
 * 2）调用
 * 3)销毁
 * 
 * 
 * filter的部署：
 * 1）通过web.xml配置方式：注册，映射
 * 2）使用注解方式：
 * 
 *
 * 
 */
public class FilterFunction implements Filter {

    /**
     * Default constructor. 
     */
    public FilterFunction() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter destroy()
	 */
	public void destroy() {
		System.out.println("------过滤器销毁----");
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		//对request,reponse记性一些预处理：1）字符编码utf-8
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		// pass the request along the filter chain
		chain.doFilter(request, response);//检查过滤器链，如果有传递给下一个，没的话执行目标资源
		
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("this is filterfunction....");
		String filterName=fConfig.getFilterName();
		String param1=fConfig.getInitParameter("name");
		String param2=fConfig.getInitParameter("like");
		//返回枚举类型Enumeration<String>
		Enumeration<String> names=fConfig.getInitParameterNames();
		
		System.out.println(filterName);
		System.out.println(param1);
		System.out.println(param2);
		while(names.hasMoreElements()){
			String name=names.nextElement();
			System.out.println(name);
		}
		
	}

}
